import random
import re

from info import sr, constants
from info.modules.libs.yuntongxun.sms import CCP
from info.response_code import RET
from . import passport_blu
from flask import request, abort, current_app, make_response, jsonify
from info.utils.captcha.image import captcha


@passport_blu.route('/img_code')
def img_code():
    # 获取图片key
    img_code_id = request.args.get("img_code_id", None)
    # 判断正确性
    if not img_code_id:
        return abort(403)

    # 生成图片验证码
    name, code_text, code_img = captcha.generate_captcha()

    # 将图片key和图片文字保存到redis中
    try:
        sr.set("img_code_id" + img_code_id, code_text, ex=constants.IMAGE_CODE_REDIS_EXPIRES)
    except BaseException as error:
        current_app.logger.debug(error)  # 日志输出
        abort(500)  # 抛出服务器错误异常

    response = make_response(code_img)  # 创建响应对象
    response.headers["content-type"] = "image/jpg"  # 设置类型,避免部分浏览器解析错误
    return response


@passport_blu.route('/sms_code', methods=['POST'])
def sms_code():
    # 获取参数
    json_dict = request.json
    mobile = json_dict.get("mobile", None)
    img_code = json_dict.get("imgcode", None)
    imgcodeid = json_dict.get("imgcodeid", None)

    # 验证参数完整性, 格式是否正确
    if not all([mobile, img_code, imgcodeid]):
        # return jsonify(errno="4100", errmsg="参数有误")
        return jsonify(errno=RET.PARAMERR, errmsg="参数有误")
    elif not re.match(r"^1[35678]\d{9}$", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号格式错误")

    # 读取图片验证码
    try:
        img_code_text = sr.get("img_code_id" + imgcodeid)
    except BaseException:
        return jsonify(errno=RET.DBERR, errmsg="数据库读取错误")
    # 校验验证码
    if not img_code_text:  # 是否过期
        return jsonify(errno=RET.NODATA, errmsg="验证码已过期")
    elif img_code.upper() != img_code_text:  # 是否一致
        return jsonify(errno=RET.DATAERR, errmsg="验证码错误")

    # 生成4位随机数
    sms_code_text = "%04d" % random.randint(0, 9999)
    # 发送短信
    result = CCP().send_template_sms(mobile, [sms_code_text, constants.IMAGE_CODE_REDIS_EXPIRES / 60], 1)
    if result != 0:
        return jsonify(errno=RET.THIRDERR, errmsg="发送短信失败")

    # 保存短信验证码
    try:
        sr.set("sms_" + mobile, sms_code_text, constants.SMS_CODE_REDIS_EXPIRES)
    except BaseException as error:
        current_app.logger.debug(error)
        return jsonify(error.RET.DBERR, errmsg="数据库写入错误")

    return jsonify(errno=RET.OK, errmsg="注册成功")
